package com.atguigu.gulimall.product;


import org.mybatis.spring.annotation.MapperScan;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cache.annotation.EnableCaching;
import org.springframework.cloud.client.discovery.EnableDiscoveryClient;
import org.springframework.cloud.openfeign.EnableFeignClients;
import org.springframework.transaction.annotation.EnableTransactionManagement;

/**
 * 1、整合 mybatisPlus
 *  1）、导入依赖
 *  2）、配置
 *      1、配置数据源
 *          1）、导入数据库的驱动
 *          2）、配置数据源
 *      2、配置 mybatisPlus
 *          1）、使用MapperScan
 *          2）、告诉MP sql映射文件位置
 * 2、逻辑删除
 *  1.配置全局的逻辑删除的规则（省略）
 *  2.配置逻辑删除的组件Bean（省略）
 *  3.给 Bean 加上逻辑删除注解 @TableLogic
 *
 * 3、JSR303
 *  1.给 Entity 字段添加校验注解  @NotNull(message="自定义message提示")
 *
 *  2.给 对应 controller 方法参数中添加注解 @Valid
 *      效果：校验错误以后会有默认的响应
 *
 *  3.给校验的 controller 方法参数后紧跟一个 BindingResult 可以获取校验结果
 *
 *  4.分组校验（多场景复杂校验）
 *        1.使用groups @NotNull(groups="{Groups_Interface.class}")
 *        2.在 controller 对应的方法参数中添加注解 @Validated({Groups_Interface.class}) 开启分组校验
 *        3.默认没有指定分组的校验注解 在分组校验情况下不生效  只会在不分组下生效 在 @Validated 情况下生效
 *
 *  5.自定义校验
 *      1.编写一个自定义的校验注解
 *      2.编写一个自定义的校验器 ConstraintValidator
 *      3.关联自定义校验注解和自定义校验器
 *      @Documented
 *      @Constraint(validatedBy = {ListValueConstraintValidator.class,...(可以指定多个不同的校验器，适配不同类型的校验)})
 *      @Target({ElementType.METHOD, ElementType.FIELD, ElementType.ANNOTATION_TYPE, ElementType.CONSTRUCTOR, ElementType.PARAMETER, ElementType.TYPE_USE})
 *      @Retention(RetentionPolicy.RUNTIME)
 *
 * 4、统一的异常处理
 * @ControllerAdvice
 *  1.编写异常处理类，使用 @RestControllerAdvice(basePackages="controller的包路径")
 *  2.使用 @ExceptionHandle(value="错误的类型") 注解可以处理异常
 *
 */

@EnableDiscoveryClient
@MapperScan("com.atguigu.gulimall.product.dao")
@SpringBootApplication
@EnableFeignClients(basePackages = "com.atguigu.gulimall.product.feign")
@EnableTransactionManagement
public class GulimallProductApplication {

    public static void main(String[] args){
        SpringApplication.run(GulimallProductApplication.class, args);

    }
}
